import axios from "axios"
import { ElMessage } from 'element-plus'
import 'element-plus/theme-chalk/el-message.css'
import { useUserStore } from "@/stores/userStore"
import router from "@/router"

const baseURL = import.meta.env.VITE_API_URL;

console.log("baseURL---->" + baseURL)

axios.defaults.baseURL = baseURL;
axios.defaults.timeout = 15000;

//axios请求拦截器
axios.interceptors.request.use(config => {
    // 1.从pinia获取token数据
    const userStore = useUserStore()
    // 2.拼接token数据
    const token = userStore.userInfo.token
    if (token) {
        config.headers["x-access-token"] = token;
    }
    return config
}, e => Promise.reject(e))

//axios响应拦截器
axios.interceptors.response.use(res => {
    const { code, msg } = res.data;
    // 10002 刷新token
    if (code === 10002) {
        // 刷新 token 并再次发送请求
        const userStore = useUserStore();
        return refreshTokenAndRetry(res.config, res.data, userStore)
    }
    // 401token失效处理
    if (code === 401) {
        const useStore = useUserStore();
        useStore.clearUserInfo();
        router.push('/login');
    }
    // 20001 用户不存在，跳转注册页面
    if (code === 20001){
        router.push('/register');
    }
    // 统一错误提示
    if (code !== 200) {
        ElMessage({ type: 'warning', message: msg });
        return Promise.reject(msg); // 返回一个带有错误消息的 rejected Promise
    }
    // ElMessage({type: 'success', message: msg})
    console.log(res.data)
    return res.data; // 返回响应对象而不是 Promise.reject(e)
}, error => {
    console.error('请求出错:', error);
    return Promise.reject(error);
});

const refreshTokenAndRetry = function (config, data, userStore) {
    console.log('原token----->' + config.headers["x-access-token"]);
    console.log('刷新后的token----->' + data.data);
    // 获取新的 token 数据
    const newToken = data.data;

    // 存储新的 token 到用户信息中
    userStore.userInfo.token = newToken;

    // 更新全局的 axios 实例中的 token
    axios.defaults.headers["x-access-token"] = newToken;

    // 重新发送被挂起的请求
    return axios(config);
}

export default axios;
